# 六大常见异常
# ZeroDivisionError 除零异常
# print(10 / 0) # ZeroDivisionError 除零异常

# NameError 名称异常
# name 'a' is not defined
# 变量a未定义就使用
# print(a)

# ValueError 数值异常
# int('abc')

# TypeError 类型异常
print(1 + 1)
# +号两边要不都是数值型的数 要不都是字符串 否则抛出TypeError
# print(1 + "2")

# IndexError 索引异常
list1 = [1, 2, 3]
print(list1[0])
print(list1[1])
print(list1[2])
# list index out of range
# print(list1[3])

# AttributeError 属性异常
a = "abcdefg"
print(a.strip())
print(a.replace("a", "A"))
# 字符串对象并没有sss方法或属性 则会抛出AttributeError
# a.sss

# 异常处理
'''
try:
    四个空格
    可能会发生异常的代码
except 可能会发生异常1 as 别名:
    异常1发生了对应的处理逻辑
except 可能会发生异常2 as 别名:
    异常2发生了对应的处理逻辑
else:
    没有发生任何异常则会执行
finally:
    不管有没有发生异常都会执行
'''

try:
    print("start")
    print(10 / 0)
    print("It is ok!")
# 按照except的先后顺序依次匹配
except Exception as e:
    print(e)
    print("发生了异常")
except ZeroDivisionError as e:
    print(e)
    print("发生了除零异常，请检查除数")
except NameError as e:
    print(e)
    print("捕获到了NameError，请先定义再使用")
else:
    print("没有发生任何异常")
finally:
    print("不管有没有发生异常都会执行")


# 自定义异常
class AlienError(Exception):
    def __init__(self):
        super(AlienError, self).__init__("发生了外星人异常")


age = int(input("请输入一个年龄："))
try:
    if age < 0:
        # 抛一个 外星人异常
        raise AlienError
    else:
        print("age is :%d" % age)
except AlienError as e:
    print(e)
